﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;
using TS2015.Models;
using System.Web.Script.Serialization;
using System.Data.OleDb;
using System.Data;
using System.Data.Entity.Validation;
using System.Text;
//using System.Web.UI.WebControls;
//using System.IO;
//using System.Web.UI;


namespace TS2015.Areas.Admin.Controllers
{
    public class RegistrationManagementController : Controller
    {
        TS2015Context db = new TS2015Context();
        // GET: Admin/RegistrationManagement
        bool CheckDepartment, CheckPhylum, CheckArea, CheckGroup, CheckEthnic, CheckProvince, CheckCommune,
            CheckPriorityGroup, CheckGraduateSubject, CheckGraduateSubject_Group, CheckMajor;
        string IDDepartment, IDPhylum, IDGraduateSubject;
        //List<string> error = new List<string>();
        //string count;
        int No = 0;
        List<SelectListItem> mess = new List<SelectListItem>();
        #region Check Type
        bool CheckDateTime(string String)
        {
            DateTime Date;
            if (DateTime.TryParse(String, out Date))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        bool CheckInt(string String)
        {
            int Int;
            if (Int32.TryParse(String, out Int))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        bool CheckDouble(string String)
        {
            double Double;
            if (Double.TryParse(String, out Double))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion
        #region TrainingSystem
        public JsonResult GetTrainingSystem()
        {
            return Json(db.TbHeDaoTaos.ToList(), JsonRequestBehavior.AllowGet);
        }
        
        public ActionResult TrainingSystem()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("trainingsystem", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadTrainingSystem([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbHeDaoTaos.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateTrainingSystem([DataSourceRequest] DataSourceRequest request, TbHeDaoTao data)
        {
 
            if (!CheckRole.IsRole("trainingsystem_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });
 

            if (data != null && ModelState.IsValid)
            {
                var TS = db.TbHeDaoTaos;
                if (db.TbHeDaoTaos.Where(m => m.TenHeDaoTao.ToLower().Trim() == data.TenHeDaoTao.ToLower().Trim()).Count() == 0)
                {
                    TS.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Hệ đào tạo " + data.TenHeDaoTao.Trim() + " đã tồn tại!" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateTrainingSystem([DataSourceRequest] DataSourceRequest request, TbHeDaoTao data)
        {
    
            if (!CheckRole.IsRole("trainingsystem_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyTrainingSystem([DataSourceRequest] DataSourceRequest request, TbHeDaoTao data)
        {
         
            if (!CheckRole.IsRole("trainingsystem_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbHeDaoTao itemdata = db.TbHeDaoTaos.First(item => item.MaHeDaoTao == data.MaHeDaoTao);
                    db.TbHeDaoTaos.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Hệ đào tạo " + data.TenHeDaoTao.Trim() + " này vẫn còn!" + "\n" + "(Thí sinh, Thí sinh - Hệ đào tạo)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        #endregion
        #region TrainingLevel
        public JsonResult GetTrainingLevel()
        {
            return Json(db.TbBacDaoTaos.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult TrainingLevel()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("traininglevel", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            ViewBag.TS = db.TbHeDaoTaos.ToList();
            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadTrainingLevel([DataSourceRequest] DataSourceRequest request)
        {
            var bdt = from a in db.TbBacDaoTaos
                      join b in db.TbHeDaoTaos on a.MaHeDaoTao equals b.MaHeDaoTao
                      select new
                      {
                          MaBacDT = a.MaBacDT,
                          TenBacDT = a.TenBacDT,
                          MaHeDaoTao = a.MaHeDaoTao,
                          TenHeDaoTao = b.TenHeDaoTao
                      };
            return Json(bdt.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateTrainingLevel([DataSourceRequest] DataSourceRequest request, TbBacDaoTao data)
        {
            if (!CheckRole.IsRole("traininglevel_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });


            if (data != null && ModelState.IsValid)
            {
                if (db.TbBacDaoTaos.Where(m => m.TenBacDT.ToLower().Trim() == data.TenBacDT.ToLower().Trim() &&
                    m.MaHeDaoTao == data.MaHeDaoTao).Count() == 0)
                {
                    db.TbBacDaoTaos.Add(data);
                    SaveChanges(db);
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Hệ đào tạo " + data.TenBacDT.Trim() + " đã tồn tại!" });
                }

            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateTrainingLevel([DataSourceRequest] DataSourceRequest request, TbBacDaoTao data)
        {
            if (!CheckRole.IsRole("traininglevel_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyTrainingLevel([DataSourceRequest] DataSourceRequest request, TbBacDaoTao data)
        {
            if (!CheckRole.IsRole("traininglevel_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbBacDaoTao itemdata = db.TbBacDaoTaos.First(item => item.MaBacDT == data.MaBacDT);
                    db.TbBacDaoTaos.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Hệ đào tạo " + data.TenBacDT.Trim() + " này vẫn còn!" + "\n" + "(Thí sinh, Thí sinh - Hệ đào tạo)" });
                }

            }
            return Json(ModelState.ToDataSourceResult());
        }
        #endregion
        #region Department
        //[OutputCache(Duration=600)]
        public JsonResult GetDepartment()
        {
            return Json(db.TbKhoas.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Department()
        {
            if (!CheckRole.IsRole("department", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");
                //return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadDepartment([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbKhoas.ToDataSourceResult(request));
        }

        public ActionResult EditingPopup_CreateDepartment([DataSourceRequest] DataSourceRequest request, TbKhoa data)
        {
            if (!CheckRole.IsRole("department_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                var dpm = db.TbKhoas;
                if (dpm.Where(m => m.TenKhoa.ToLower().Trim() == data.TenKhoa.ToLower().Trim()).Count() == 0)
                {
                    dpm.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Khoa " + data.TenKhoa.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }

        public ActionResult EditingPopup_UpdateDepartment([DataSourceRequest] DataSourceRequest request, TbKhoa data)
        {
            if (!CheckRole.IsRole("department_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyDepartment([DataSourceRequest] DataSourceRequest request, TbKhoa data)
        {
            if (!CheckRole.IsRole("department_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbKhoa itemdata = db.TbKhoas.First(item => item.MaKhoa == data.MaKhoa);
                    db.TbKhoas.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Khoa " + data.TenKhoa.Trim() + " này vẫn còn!" + "\n" + "(Ngành)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ImportDepartment(HttpPostedFileBase FileImport)
        {
            bool state = false;
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        var khoa = db.TbKhoas.Select(m => m.TenKhoa);
                        TbKhoa item;
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Khoa"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Khoa không tồn tại!" });
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                foreach (var a in khoa)
                                {
                                    CheckDepartment = false;
                                    if (a.ToString().ToLower().Trim() == dt.Rows[i]["Khoa"].ToString().ToLower().Trim())
                                    {
                                        CheckDepartment = true;
                                        break;
                                    }
                                }
                                if(!CheckDepartment)
                                {
                                    item = new TbKhoa();
                                    item.TenKhoa = dt.Rows[i]["Khoa"].ToString().Trim();
                                    db.TbKhoas.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Khoa: " + dt.Rows[i]["Khoa"].ToString() + " đã tồn tại!" });
                                }
                            }
                            
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }
                    
                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        //[ChildActionOnly]
        [HttpPost]
        [ActionName("Insert")]
        public ActionResult Insert1()
        {
            return PartialView();
        }
        public ActionResult Insert()
        {
            return PartialView();
        }
        #region Phylum
        public JsonResult GetPhylum()
        {
            return Json(db.TbNganhs.Include(e => e.TbChuyenNganhs).ToList(), JsonRequestBehavior.AllowGet);
        }
        public JsonResult GetPhylums()
        {
            var PhylumsList = from a in db.TbNganhs
                              join b in db.TbKhoiThis on a.MaKhoiThi equals b.MaKhoiThi
                              select new
                              {
                                  IDNganh = a.IDNganh,
                                  MaNganh = a.MaNganh,
                                  TenNganh = a.TenNganh,
                                  MaKhoiThi = a.MaKhoiThi,
                                  TenKhoiThi = b.TenKhoiThi
                              };
            return Json(PhylumsList.Select(m => new { IDNganh = m.IDNganh, TenNganh = m.MaNganh + "-" + m.TenNganh + "-" + m.TenKhoiThi }), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Phylum()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("phylum", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");
                
            // Lấy danh sách khoa để tham chiếu khóa ngoại
            ViewBag.TbKhoa = db.TbKhoas.ToList();
            ViewBag.TbKhoiThi = db.TbKhoiThis.ToList();

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }

        public ActionResult EditingPopup_ReadPhylum([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbNganhs.ToDataSourceResult(request));
        }

        public ActionResult EditingPopup_CreatePhylum([DataSourceRequest] DataSourceRequest request, TbNganh data)
        {
            if (!CheckRole.IsRole("phylum_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbNganhs.Where(m => m.MaNganh.ToLower().Trim() == data.MaNganh.ToLower().Trim() &&
                    m.MaKhoiThi.ToLower().Trim() == data.MaKhoiThi.ToLower().Trim()).Count() == 0)
                {
                    db.TbNganhs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Ngành " + data.TenNganh.Trim() + " của " + db.TbKhoiThis.Where(m => m.MaKhoiThi == data.MaKhoiThi).FirstOrDefault().TenKhoiThi.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdatePhylum([DataSourceRequest] DataSourceRequest request, TbNganh data)
        {
            if (!CheckRole.IsRole("phylum_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyPhylum([DataSourceRequest] DataSourceRequest request, TbNganh data)
        {
            if (!CheckRole.IsRole("phylum_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbNganh itemdata = db.TbNganhs.First(item => item.MaNganh == data.MaNganh);
                    db.TbNganhs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu Ngành " + data.TenNganh.Trim() + " của " + db.TbKhoiThis.Where(m => m.MaKhoiThi == data.MaKhoiThi).FirstOrDefault().TenKhoiThi.Trim() + " vẫn tồn tại!" + "\n" + "(Chuyên ngành)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult ImportPhylum(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        DataTable dt = new DataTable();
                        TbNganh item;
                        oledbda.Fill(dt);
                        var ListDepartment = (from c in db.TbKhoas select c).ToList();
                        var ListGroup = (from c in db.TbKhoiThis select c).ToList();
                        var ListPhylum = (from c in db.TbNganhs select c).ToList();
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("nganh"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã ngành không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("tennganh"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên ngành không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("khoithi"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Khối thi không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("khoa"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Khoa ngành không tồn tại!" });
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckDepartment = false;
                                foreach (var a in ListDepartment)
                                {                                    
                                    if(a.TenKhoa.ToLower().Trim() == dt.Rows[i]["Khoa"].ToString().ToLower().Trim())
                                    {
                                        CheckDepartment = true;
                                        IDDepartment = a.MaKhoa.ToString().Trim();
                                        break;
                                    }
                                    //else
                                    //{
                                    //    CheckDepartment = false;
                                    //}
                                }
                                if (!CheckDepartment)
	                            {
		                            mess.Add(new SelectListItem { Text = "Khoa: " + dt.Rows[i]["Khoa"].ToString() + " không tồn tại!" });
	                            }
                                
                                CheckGroup = false;
                                foreach (var a in ListGroup)
                                {
                                    
                                    if (a.MaKhoiThi.ToLower().Trim() == dt.Rows[i]["khoithi"].ToString().ToLower().Trim())
                                    {
                                        CheckGroup = true;
                                        break;
                                    }
                                    //else
                                    //{
                                    //    CheckGroup = false;
                                    //}
                                }
                                if (!CheckGroup)
	                            {
		                            mess.Add(new SelectListItem { Text = "Khối: " + dt.Rows[i]["khoithi"].ToString() + " không tồn tại!" });
	                            }
                                
                                CheckPhylum = false;
                                foreach (var a in ListPhylum)
                                {
                                   
                                    if (a.MaKhoiThi.ToString().ToLower().Trim() == dt.Rows[i]["khoithi"].ToString().ToLower().Trim() &&
                                        a.MaNganh.ToString().ToLower().Trim() == dt.Rows[i]["nganh"].ToString().ToLower().Trim())
                                    {
                                        CheckPhylum = true;
                                        mess.Add(new SelectListItem { Text = "Ngành: " + dt.Rows[i]["nganh"].ToString() + " đã tồn tại!" });
                                        break;
                                    }
                                }
                                if (CheckDepartment && CheckGroup && !CheckPhylum)
                                {
                                    item = new TbNganh();
                                    item.MaNganh = dt.Rows[i]["nganh"].ToString().Trim();
                                    item.TenNganh = dt.Rows[i]["tennganh"].ToString().Trim();
                                    item.MaKhoa = Int32.Parse(IDDepartment);
                                    item.MaKhoiThi = dt.Rows[i]["khoithi"].ToString().Trim();
                                    db.TbNganhs.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region Major
        public JsonResult GetMajor()
        {

            return Json(db.TbChuyenNganhs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public JsonResult GetMajorByPhylum(string manganh)
        {
            var major = from c in db.TbChuyenNganhs where c.IDNganh == Int32.Parse(manganh) || c.IDNganh == null
                        select c;
            return Json(new SelectList(major.ToList(), "MaChuyenNganh", "TenChuyenNganh" ), JsonRequestBehavior.AllowGet);
        }
        
        public ActionResult Major(string id)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("major", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            // Lấy danh sách khoa để tham chiếu khóa ngoại
            ViewBag.TbNganh = db.TbNganhs.ToList();
            var Nganh_Khoi = from a in db.TbNganhs
                                 join b in db.TbKhoiThis on a.MaKhoiThi equals b.MaKhoiThi
                                 select new
                                 {
                                     IDNganh = a.IDNganh,
                                     MaNganh = a.MaNganh,
                                     TenNganh = a.TenNganh,
                                     MaKhoiThi = a.MaKhoiThi,
                                     TenKhoiThi = b.TenKhoiThi
                                 };
            ViewBag.Nganh_Khoi = Nganh_Khoi;

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadMajor([DataSourceRequest] DataSourceRequest request)
        {
            var Major = from a in db.TbChuyenNganhs
                        join b in db.TbNganhs on a.IDNganh equals b.IDNganh
                        join c in db.TbKhoiThis on b.MaKhoiThi equals c.MaKhoiThi
                        select new
                        {
                            MaChuyenNganh = a.MaChuyenNganh,
                            TenChuyenNganh = a.TenChuyenNganh,
                            IDNganh = a.IDNganh,
                            MaNganh = b.MaNganh,
                            TenNganh = b.TenNganh,
                            MaKhoiThi = b.MaKhoiThi,
                            TenKhoiThi = c.TenKhoiThi
                        };
            return Json(Major.ToDataSourceResult(request));
        }

        public ActionResult EditingPopup_CreateMajor([DataSourceRequest] DataSourceRequest request, TbChuyenNganh data)
        {
            if (!CheckRole.IsRole("major_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbChuyenNganhs.Where(m => m.MaChuyenNganh.ToLower().Trim() == data.MaChuyenNganh.ToLower().Trim()).Count() == 0)
                {
                    db.TbChuyenNganhs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Chuyên ngành " + data.TenChuyenNganh.Trim() + " đã tồn tại!" });
                }
            }
                return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateMajor([DataSourceRequest] DataSourceRequest request, TbChuyenNganh data)
        {
            if (!CheckRole.IsRole("major_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyMajor([DataSourceRequest] DataSourceRequest request, TbChuyenNganh data)
        {
            if (!CheckRole.IsRole("major_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbChuyenNganh itemdata = db.TbChuyenNganhs.First(item => item.MaChuyenNganh == data.MaChuyenNganh);
                    db.TbChuyenNganhs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu Chuyên ngành " + data.TenChuyenNganh.Trim() + " vẫn tồn tại!" + "\n" + "(Thí sinh)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportMajor(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        DataTable dt = new DataTable();
                        TbChuyenNganh item;
                        oledbda.Fill(dt);
                        var ListPhylum = (from c in db.TbNganhs select c).ToList();
                        var ListMajor = (from c in db.TbChuyenNganhs select c).ToList();
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Mã chuyên ngành"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã chuyên ngành không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên chuyên ngành"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên chuyên ngành  không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Ngành"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Ngành không tồn tại!"});
                                goto next;
                            }
                            //int m = 0;
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckPhylum = false;
                                foreach (var a in ListPhylum)
                                {
                                    
                                    if (a.MaNganh.ToLower().Trim() == dt.Rows[i]["Mã ngành"].ToString().ToLower().Trim())
                                    {
                                        CheckPhylum = true;
                                        IDPhylum = a.IDNganh.ToString().Trim();
                                        break;
                                    }
                                }
                                if (!CheckPhylum)
	                            {
		                            mess.Add(new SelectListItem { Text = "Ngành: " + dt.Rows[i]["Ngành"].ToString() + " không tồn tại!"});
	                            }
                                
                                CheckMajor = false;
                                foreach (var a in ListMajor)
                                {                                    
                                    if (a.MaChuyenNganh.ToLower().Trim() == dt.Rows[i]["Mã chuyên ngành"].ToString().ToLower().Trim())
                                    {
                                        CheckMajor = true;
                                        mess.Add(new SelectListItem { Text = "Chuyên ngành: " + dt.Rows[i]["Mã chuyên ngành"].ToString() + " đã tồn tại!"});
                                        break;
                                    }
                                }
                                if (CheckPhylum && !CheckMajor)
                                {
                                    item = new TbChuyenNganh();
                                    item.MaChuyenNganh = dt.Rows[i]["Mã chuyên ngành"].ToString().Trim();
                                    item.TenChuyenNganh = dt.Rows[i]["Tên chuyên ngành"].ToString().Trim();
                                    item.IDNganh = Int32.Parse(IDPhylum);
                                    db.TbChuyenNganhs.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                                //mess = error;
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }
                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region Group
        public JsonResult GetGroup()
        {
            return Json(db.TbKhoiThis.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Group()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("group", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadGroup([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbKhoiThis.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateGroup([DataSourceRequest] DataSourceRequest request, TbKhoiThi data)
        {
            if (!CheckRole.IsRole("group_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbKhoiThis.Where(m => m.MaKhoiThi.ToLower().Trim() == data.MaKhoiThi.ToLower().Trim()).Count() == 0)
                {
                    db.TbKhoiThis.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Khối thi " + data.TenKhoiThi.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateGroup([DataSourceRequest] DataSourceRequest request, TbKhoiThi data)
        {
            if (!CheckRole.IsRole("group_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyGroup([DataSourceRequest] DataSourceRequest request, TbKhoiThi data)
        {
            if (!CheckRole.IsRole("group_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbKhoiThi itemdata = db.TbKhoiThis.First(item => item.MaKhoiThi == data.MaKhoiThi);
                    db.TbKhoiThis.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Khối thi " + data.TenKhoiThi.Trim() + " vẫn tồn tại!" + "\n" + "(Môn thi - Khối thi, Ngành)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportGroup(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        var khoithi = db.TbKhoiThis.Select(m => m.MaKhoiThi.ToString().ToLower().Trim());
                        TbKhoiThi item;
                        oledbda.Fill(dt);
                        
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Mã khối thi"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã khối thi không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên khối thi"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên khối thi không tồn tại!"});
                                goto next;
                            } 
                            
                            CheckGroup = false;
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                             
                                if (khoithi.Contains(dt.Rows[i]["Mã khối thi"].ToString().ToLower().Trim()))
                                {
                                    CheckGroup = true;
                                }
                                //foreach (var a in khoithi)
                                //{
                                    
                                //    if (a.ToString().ToLower().Trim() == dt.Rows[i]["Mã khối thi"].ToString().ToLower().Trim())
                                //    {
                                //        CheckGroup = true;
                                //        break;
                                //    }
                                //}
                                if (dt.Rows[i]["Mã khối thi"].ToString().Trim() != "" && dt.Rows[i]["Tên khối thi"].ToString().Trim() != "")
                                {
                                    if (!CheckGroup)
                                    {
                                        item = new TbKhoiThi();
                                        item.MaKhoiThi = dt.Rows[i]["Mã khối thi"].ToString().Trim();
                                        item.TenKhoiThi = dt.Rows[i]["Tên khối thi"].ToString().Trim();
                                        db.TbKhoiThis.Add(item);
                                        db.SaveChanges();
                                        No += 1;
                                    }
                                    else
                                    {
                                        mess.Add(new SelectListItem { Text = "Khối thi: " + dt.Rows[i]["Mã khối thi"].ToString() + " đã tồn tại!" });
                                    }
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region Area
        public JsonResult GetArea()
        {
            return Json(db.TbKhuVucs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Area()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("area", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadArea([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbKhuVucs.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateArea([DataSourceRequest] DataSourceRequest request, TbKhuVuc data)
        {
            if (!CheckRole.IsRole("area_c", Session["Function"] as string[]))
               return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            var x = db.TbKhuVucs;
            if (x.Where(m => m.MaKhuVuc == data.MaKhuVuc).Count() == 0)
            {
                if (data != null && ModelState.IsValid)
                {
                    db.TbKhuVucs.Add(data);
                    db.SaveChanges();
                }
            }
            else
            {
                return this.Json(new DataSourceResult { Errors = "Khu vực "+data.TenKhuVuc.Trim()+" đã tồn tại!" });
            }
            
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateArea([DataSourceRequest] DataSourceRequest request, TbKhuVuc data)
        {
            if (!CheckRole.IsRole("area_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            //ViewBag.IsDisabled = 1;
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyArea([DataSourceRequest] DataSourceRequest request, TbKhuVuc data)
        {
            if (!CheckRole.IsRole("area_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbKhuVuc itemdata = db.TbKhuVucs.First(item => item.MaKhuVuc == data.MaKhuVuc);
                    db.TbKhuVucs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Khu vực " + data.TenKhuVuc.Trim() + " vẫn tồn tại!" + "\n" + "(Trường THPT)" });
                }
                            
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportArea(HttpPostedFileBase FileImport)
        {
            //List<SelectListItem> error = new List<SelectListItem>();
            bool state = false;
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        //if (System.IO.File.Exists(path))
                        //{

                        //    System.IO.File.Delete(path);
                        //}
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        TbKhuVuc item;
                        //int STT = 0;
                        var Kv = db.TbKhuVucs.Select(m => m.MaKhuVuc);
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Mã khu vực"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã khu vực không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên khu vực"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên khu vực không tồn tại!" });
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckArea = false;
                                foreach (var a in Kv)
                                {
                                    
                                    if(a.ToString().ToLower().Trim() == dt.Rows[i]["Mã khu vực"].ToString().ToLower().Trim())
                                    {
                                        CheckArea = true;
                                        break;
                                    }
                                }
                                if(!CheckArea)
                                {
                                    item = new TbKhuVuc();
                                    item.MaKhuVuc = dt.Rows[i]["Mã khu vực"].ToString().Trim();
                                    item.TenKhuVuc = dt.Rows[i]["Tên khu vực"].ToString().Trim();
                                    db.TbKhuVucs.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Khu vực: " + dt.Rows[i]["Mã khu vực"].ToString().Trim() + " đã tồn tại!" });
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                          
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                 mess.Add(new SelectListItem { Text = "Có lỗi." });

            return Json(new { State = state, Message = mess });
        }
        //[HttpPost]
        public ActionResult ExportArea(string contentType, string base64, string fileName)
        {
            var fileContents = Convert.FromBase64String(base64);

            return File(fileContents, contentType, fileName);
        }
        #endregion
        #region Ethnic
        public JsonResult GetEthnic()
        {
            return Json(db.TbDanTocs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Ethnic()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("ethnic", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadEthnic([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbDanTocs.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateEthnic([DataSourceRequest] DataSourceRequest request, TbDanToc data)
        {
            if (!CheckRole.IsRole("ethnic_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbDanTocs.Where(m => m.TenDanToc.ToLower().Trim() == data.TenDanToc.ToLower().Trim()).Count() == 0)
                {
                    db.TbDanTocs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Dân tộc " + data.TenDanToc.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateEthnic([DataSourceRequest] DataSourceRequest request, TbDanToc data)
        {
            if (!CheckRole.IsRole("ethnic_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyEthnic([DataSourceRequest] DataSourceRequest request, TbDanToc data)
        {
            if (!CheckRole.IsRole("ethnic_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbDanToc itemdata = db.TbDanTocs.First(item => item.MaDanToc == data.MaDanToc);
                    db.TbDanTocs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                   return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Dân tộc " + data.TenDanToc.Trim() + " vẫn tồn tại!" + "\n" + "(Thí sinh)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportEthnic(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        TbDanToc item;
                        var ethnic = db.TbDanTocs.Select(m => m.TenDanToc);
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Dân tộc"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Dân tộc không tồn tại!"});
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckEthnic = false;
                                foreach (var a in ethnic)
                                {
                                    
                                    if (a.ToString().ToLower().Trim() == dt.Rows[i]["Dân tộc"].ToString().ToLower().Trim())
                                    {
                                        CheckEthnic = true;
                                        break;
                                    }
                                }
                                if(!CheckEthnic)
                                {
                                    item = new TbDanToc();
                                    item.TenDanToc = dt.Rows[i]["Dân tộc"].ToString().Trim();
                                    //item.MoTa = dt.Rows[i]["Mô tả"].ToString().Trim();
                                    db.TbDanTocs.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                 }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Dân tộc: " + dt.Rows[i]["Dân tộc"].ToString() + " đã tồn tại!"});
                                }  
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region Province
        //[OutputCache(Duration=600)]
        public JsonResult GetProvince()
        {
            return Json(db.TbTinhs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult Province()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("province", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadProvince([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbTinhs.ToDataSourceResult(request));
        }

        public ActionResult EditingPopup_CreateProvince([DataSourceRequest] DataSourceRequest request, TbTinh data)
        {
            if (!CheckRole.IsRole("province_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbTinhs.Where(m => m.MaTinh.ToLower().Trim() == data.MaTinh.ToLower().Trim()).Count() == 0)
                {
                    db.TbTinhs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Tỉnh/TP " + data.TenTinh.Trim() + " đã tồn tại!" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }

        public ActionResult EditingPopup_UpdateProvince([DataSourceRequest] DataSourceRequest request, TbTinh data)
        {
            if (!CheckRole.IsRole("province_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyProvince([DataSourceRequest] DataSourceRequest request, TbTinh data)
        {
            if (!CheckRole.IsRole("province_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbTinh itemdata = db.TbTinhs.First(item => item.MaTinh == data.MaTinh);
                    db.TbTinhs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Tỉnh/TP " + data.TenTinh.Trim() + " vẫn tồn tại!" + "\n" + "(Huyện, Trường THPT)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        
        public ActionResult ImportProvince(HttpPostedFileBase FileImport)
        {
            
            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        DataTable dt = new DataTable();
                        TbTinh item;
                        var province = db.TbTinhs.Select(m => m.MaTinh);
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Mã tỉnh"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã tỉnh không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên tỉnh"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên tỉnh không tồn tại!"});
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            { 
                                CheckProvince = false;
                                foreach (var a in province)
                                {
                                   
                                    if (a.ToString().ToLower().Trim() == dt.Rows[i]["Mã tỉnh"].ToString().ToLower().Trim())
                                    {
                                        CheckProvince = true;
                                        break;
                                    }
                                }
                                if (dt.Rows[i]["Mã tỉnh"].ToString().Trim() != "" && dt.Rows[i]["Tên Tỉnh"].ToString().Trim() != "")
                                {
                                    if (!CheckProvince)
                                    {
                                        item = new TbTinh();
                                        item.MaTinh = dt.Rows[i]["Mã Tỉnh"].ToString().Trim();
                                        item.TenTinh = dt.Rows[i]["Tên Tỉnh"].ToString().Trim();
                                        db.TbTinhs.Add(item);
                                        SaveChanges(db);
                                        No += 1;
                                    }
                                    else
                                    {
                                        mess.Add(new SelectListItem { Text = "Tỉnh/TP: " + dt.Rows[i]["Tên tỉnh"].ToString() + " đã tồn tại!" });
                                    }         
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No.ToString() + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No.ToString() + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }
                }               
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new {State=state,Message=mess});
        }
        #endregion
        #region Commune

        public ActionResult Commune()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("commune", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            // Lấy danh sách khoa để tham chiếu khóa ngoại
            ViewBag.TbTinh = db.TbTinhs.ToList();

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadCommune([DataSourceRequest] DataSourceRequest request)
        {
            var data = db.TbHuyens;

            return Json(data.ToDataSourceResult(request));
        }

        public ActionResult EditingPopup_CreateCommune([DataSourceRequest] DataSourceRequest request, TbHuyen data)
        {
            if (!CheckRole.IsRole("commune_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbHuyens.Where(m => (m.MaHuyen.ToLower().Trim() == data.MaHuyen.ToLower().Trim()) || 
                    (m.MaTinh.ToLower().Trim() == data.MaTinh.ToLower().Trim() && m.TenHuyen.ToLower().Trim() == data.TenHuyen.ToLower().Trim())).Count() == 0)
                {
                    db.TbHuyens.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Huyện/Quận " + data.TenHuyen.Trim() + " đã tồn tại!" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateCommune([DataSourceRequest] DataSourceRequest request, TbHuyen data)
        {
            if (!CheckRole.IsRole("commune_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyCommune([DataSourceRequest] DataSourceRequest request, TbHuyen data)
        {
            if (!CheckRole.IsRole("commune_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbHuyen itemdata = db.TbHuyens.First(item => item.MaHuyen == data.MaHuyen);
                    db.TbHuyens.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Huyện/Quận " + data.TenHuyen.Trim() + " vẫn tồn tại!" + "\n" + "(Thí sinh)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        
        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult ImportCommune(HttpPostedFileBase FileImport)
        {
            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        DataTable dt = new DataTable();
                        TbHuyen item;
                        oledbda.Fill(dt);
                        var ListProvince = (from c in db.TbTinhs select c).ToList();
                        var ListCommune = db.TbHuyens.Select(m => m.MaHuyen);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Mã huyện"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã huyện không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên huyện"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên huyện không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Mã tỉnh"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Mã tỉnh không tồn tại!"});
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckProvince = false;
                                foreach (var a in ListProvince)
                                {
                                    
                                    if (a.MaTinh.ToLower().Trim() == dt.Rows[i]["Mã tỉnh"].ToString().ToLower().Trim())
                                    {
                                        CheckProvince = true;
                                        break;
                                    }
                                }
                                if (!CheckProvince)
                                {
                                    mess.Add(new SelectListItem { Text = "Tỉnh: " + dt.Rows[i]["Mã tỉnh"].ToString() + " không tồn tại!" });
                                } 
                                CheckCommune = false;
                                foreach (var b in ListCommune)
                                {
                                   
                                    if (b.ToLower().Trim() == dt.Rows[i]["Mã huyện"].ToString().ToLower().Trim())
                                    {
                                        CheckCommune = true;
                                        mess.Add(new SelectListItem { Text = "Huyện: " + dt.Rows[i]["Mã huyện"].ToString() + " đã tồn tại!" });
                                        break;
                                    }
                                }
                                if (CheckProvince && !CheckCommune)
                                {
                                    item = new TbHuyen();
                                    item.MaHuyen = dt.Rows[i]["Mã huyện"].ToString().Trim();
                                    item.TenHuyen = dt.Rows[i]["Tên huyện"].ToString().Trim();
                                    item.MaTinh = dt.Rows[i]["Mã tỉnh"].ToString().Trim();
                                    db.TbHuyens.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region PriorityGroup
        public JsonResult GetPriorityGroup()
        {
            return Json(db.TbDoiTuongUuTiens.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult PriorityGroup()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("prioritygroup", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadPriorityGroup([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbDoiTuongUuTiens.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreatePriorityGroup([DataSourceRequest] DataSourceRequest request, TbDoiTuongUuTien data)
        {
            if (data != null && ModelState.IsValid)
            {
                if (db.TbDoiTuongUuTiens.Where(m => m.TenDoiTuong == data.TenDoiTuong && 
                    m.NhomDoiTuong== data.NhomDoiTuong).Count() == 0)
                {
                    db.TbDoiTuongUuTiens.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Đối tượng " + data.TenDoiTuong.Trim() + " đã tồn tại!)" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdatePriorityGroup([DataSourceRequest] DataSourceRequest request, TbDoiTuongUuTien data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyPriorityGroup([DataSourceRequest] DataSourceRequest request, TbDoiTuongUuTien data)
        {
            if (data != null)
            {
                try
                {
                    TbDoiTuongUuTien itemdata = db.TbDoiTuongUuTiens.First(item => item.MaDoiTuong == data.MaDoiTuong);
                    db.TbDoiTuongUuTiens.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Đối tượng " + data.TenDoiTuong.Trim() + " vẫn tồn tại!" + "\n" + "(Thí sinh)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportPriorityGroup(HttpPostedFileBase FileImport)
        {

            bool state = false;
            if (FileImport != null)
            {
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        var ListPriorityGroup = db.TbDoiTuongUuTiens.Select(m => m.TenDoiTuong);
                        DataTable dt = new DataTable();
                        TbDoiTuongUuTien item;
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Tên đối tượng ưu tiên"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên đối tượng ưu tiên không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Nhóm"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Nhóm không tồn tại!"});
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckPriorityGroup = false;
                                foreach (var b in ListPriorityGroup)
                                {
                                   
                                    if (b.ToLower().Trim() == dt.Rows[i]["Tên đối tượng ưu tiên"].ToString().ToLower().Trim())
                                    {
                                        CheckPriorityGroup = true;
                                        break;
                                    }
                                }
                                if (!CheckPriorityGroup)
                                {
                                    item = new TbDoiTuongUuTien();
                                    item.TenDoiTuong = dt.Rows[i]["Tên đối tượng ưu tiên"].ToString().Trim();
                                    if (dt.Rows[i]["Nhóm"].ToString().ToLower().Trim() == "Nhóm 1".ToLower().Trim() || dt.Rows[i]["Nhóm"].ToString().ToLower().Trim() == "1".ToLower().Trim())
                                    {
                                        item.NhomDoiTuong = NhomDoiTuong.Nhom1;
                                    }
                                    else
                                    {
                                        item.NhomDoiTuong = NhomDoiTuong.Nhom2;
                                    }
                                    db.TbDoiTuongUuTiens.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Đối tượng: " + dt.Rows[i]["Tên đối tượng ưu tiên"].ToString() + " đã tồn tại!"});
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region GraduateSubject
        public JsonResult GetGraduateSubject()
        {
            return Json(db.TbMonTotNghieps.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult GraduateSubject()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadGraduateSubject([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbMonTotNghieps.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult EditingPopup_CreateGraduateSubject([DataSourceRequest] DataSourceRequest request, TbMonTotNghiep data)
        {
            if (data != null && ModelState.IsValid)
            {
                if (db.TbMonTotNghieps.Where(m => m.TenMon.ToLower().Trim() == data.TenMon.ToLower().Trim()).Count() == 0)
                {
                    db.TbMonTotNghieps.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Môn " + data.TenMon.Trim() + " đã tồn tại" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateGraduateSubject([DataSourceRequest] DataSourceRequest request, TbMonTotNghiep data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyGraduateSubject([DataSourceRequest] DataSourceRequest request, TbMonTotNghiep data)
        {
            if (data != null)
            {
                try
                {
                    TbMonTotNghiep itemdata = db.TbMonTotNghieps.First(item => item.MaMon == data.MaMon);
                    db.TbMonTotNghieps.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                    return this.Json(new DataSourceResult { Errors = "Dữ liệu liên quan đến Môn " + data.TenMon.Trim() + " vẫn tồn tại!" + "\n" + "(Môn thi - Khối thi, Điểm tốt nghiệp)" });
                }
                
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult ImportGraduteSubject(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        var ListGraduateSubject = db.TbMonTotNghieps.Select(m => m.TenMon);
                        TbMonTotNghiep item;
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Tên môn"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên môn không tồn tại!"});
                                goto next;
                            }
                            for (int i = 0; i < dt.Rows.Count; i++)
                            { 
                                CheckGraduateSubject = false;
                                foreach (var b in ListGraduateSubject)
                                {
                                   
                                    if (b.ToLower().Trim() == dt.Rows[i]["Tên môn"].ToString().ToLower().Trim())
                                    {
                                        CheckGraduateSubject = true;
                                        break;
                                    }
                                }
                                if (!CheckGraduateSubject)
                                {
                                    item = new TbMonTotNghiep();
                                    item.TenMon = dt.Rows[i]["Tên môn"].ToString().Trim();
                                    db.TbMonTotNghieps.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "Môn: " + dt.Rows[i]["Tên môn"].ToString() + " đã tồn tại!"});
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });
            return Json(new { State = state, Message = mess });
        }
        #endregion  
        #region GraduateSubject_Group
        public JsonResult GetGraduateSubject_Group()
        {
            return Json(db.TbNganhs.ToList(), JsonRequestBehavior.AllowGet);
        }
        public ActionResult GraduateSubject_Group()
        {
            // Lấy danh sách khoa để tham chiếu khóa ngoại
            ViewBag.TbMonTotNghiep = db.TbMonTotNghieps.ToList();
            ViewBag.TbKhoiThi = db.TbKhoiThis.ToList();

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult EditingPopup_ReadGraduateSubject_Group([DataSourceRequest] DataSourceRequest request)
        {
            var data = db.TbKhoiThi_MonTotNghieps;

            return Json(data.ToDataSourceResult(request));
        }
        public ActionResult EditingPopup_CreateGraduateSubject_Group([DataSourceRequest] DataSourceRequest request, TbKhoiThi_MonTotNghiep data)
        {
            if (data != null && ModelState.IsValid)
            {
                if (db.TbKhoiThi_MonTotNghieps.Where(m => m.MaKhoiThi.ToLower().Trim() == data.MaKhoiThi.ToLower().Trim() &&
                    m.MaMon.ToString().Trim() == data.MaMon.ToString().Trim()).Count() == 0)
                {
                    db.TbKhoiThi_MonTotNghieps.Add(data);
                    SaveChanges(db);
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Môn " + db.TbMonTotNghieps.Where(m => m.MaMon.ToString().Trim() == data.MaMon.ToString().Trim()).FirstOrDefault().TenMon.Trim() + " của Khối " + db.TbKhoiThis.Where(m => m.MaKhoiThi.ToLower().Trim() == data.MaKhoiThi.ToLower().Trim()).FirstOrDefault().TenKhoiThi.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_UpdateGraduateSubject_Group([DataSourceRequest] DataSourceRequest request, TbKhoiThi_MonTotNghiep data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult EditingPopup_DestroyGraduateSubject_Group([DataSourceRequest] DataSourceRequest request, TbKhoiThi_MonTotNghiep data)
        {
            if (data != null)
            {
                try
                {
                    TbKhoiThi_MonTotNghiep itemdata = db.TbKhoiThi_MonTotNghieps.First(item => item.MaMon == data.MaMon && item.MaKhoiThi == data.MaKhoiThi);
                    db.TbKhoiThi_MonTotNghieps.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                     return this.Json(new DataSourceResult { Errors = "Có lỗi xảy ra trong quá trình xóa!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult ImportGraduateSubject_Group(HttpPostedFileBase FileImport)
        {

            bool state = false;
            //string mess = "";
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);
                        DataTable dt = new DataTable();
                        TbKhoiThi_MonTotNghiep item;
                        oledbda.Fill(dt);
                        var ListGraduateSubject = (from c in db.TbMonTotNghieps select c).ToList();
                        var ListGroup = (from c in db.TbKhoiThis select c).ToList();
                        var ListGraduateSubject_Group = (from c in db.TbKhoiThi_MonTotNghieps select c).ToList();
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Môn thi"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Môn thi không tồn tại!"});
                                goto next;
                            }
                            if (!dt.Columns.Contains("Khối thi"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Khối thi không tồn tại!"});
                                goto next;
                            }
                            
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                CheckGraduateSubject = false;
                                foreach (var a in ListGraduateSubject)
                                {
                                    
                                    if (a.TenMon.ToLower().Trim() == dt.Rows[i]["Môn thi"].ToString().ToLower().Trim())
                                    {
                                        CheckGraduateSubject = true;
                                        IDGraduateSubject = a.MaMon.ToString().Trim();
                                        break;
                                    }
                                }
                                if (!CheckGraduateSubject)
                                {
                                    mess.Add(new SelectListItem { Text = "Môn thi: " + dt.Rows[i]["Môn thi"].ToString() + " không tồn tại!" });
                                }
                                CheckGroup = false;
                                foreach (var b in ListGroup)
                                {
                                    
                                    if (b.MaKhoiThi.ToLower().Trim() == dt.Rows[i]["Khối thi"].ToString().ToLower().Trim())
                                    {
                                        CheckGroup = true;
                                        break;
                                    }
                                }
                                if (!CheckGroup)
                                {
                                    mess.Add(new SelectListItem { Text = "Khối: " + dt.Rows[i]["Khối thi"].ToString() + " không tồn tại!" });
                                } 
                                CheckGraduateSubject_Group = false;
                                foreach (var c in ListGraduateSubject_Group)
                                {
                                   
                                    if (c.MaKhoiThi.ToString().ToLower().Trim() == dt.Rows[i]["Khối thi"].ToString().ToLower().Trim() &&
                                        c.TbMonTotNghiep.TenMon.ToString().ToLower().Trim() == dt.Rows[i]["Môn thi"].ToString().ToLower().Trim())
                                    {
                                        CheckGraduateSubject_Group = true;
                                        break;
                                    }
                                }
                                if (!CheckGraduateSubject_Group)
                                {
                                    mess.Add(new SelectListItem { Text = "Khối thi - môn: " + dt.Rows[i]["Khối thi"].ToString() + ", " +dt.Rows[i]["Môn thi"].ToString() + " đã tồn tại!" });
                                }
                                if (CheckGraduateSubject && CheckGroup && !CheckGraduateSubject_Group)
                                {
                                    item = new TbKhoiThi_MonTotNghiep();
                                    item.MaMon = Int32.Parse(IDGraduateSubject);
                                    item.MaKhoiThi = dt.Rows[i]["Khối thi"].ToString().Trim();
                                    db.TbKhoiThi_MonTotNghieps.Add(item);
                                    db.SaveChanges();
                                    No += 1;
                                }
                            }
                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi!" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        private void SaveChanges(DbContext context)
        {
            try
            {
                context.SaveChanges();
            }
            catch (DbEntityValidationException ex)
            {
                StringBuilder sb = new StringBuilder();

                foreach (var failure in ex.EntityValidationErrors)
                {
                    sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                    foreach (var error in failure.ValidationErrors)
                    {
                        sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                        sb.AppendLine();
                    }
                }

                throw new DbEntityValidationException(
                    "Entity Validation Failed - errors follow:\n" +
                    sb.ToString(), ex
                ); // Add the original exception as the innerException
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}